<?php
include 'AuthenticatedUserController.php';
class User_OrderController extends User_AuthenticatedUserController {
	public function preDispatch() {
		Zend_Loader::loadClass("AuthModel");
    	$auth = new AuthModel();
    	if($auth->getUserInfo('type') == NORMAL_USER){
	    	$layoutPath = APPLICATION_PATH  . '/templates/user/user';
    	}else{
    		$layoutPath = APPLICATION_PATH  . '/templates/admin/admin';
    	}
		
		//set layout
		$option = array (	'layout' 		=> 'index', 
              	        'layoutPath' 	=> $layoutPath );
		Zend_Layout::startMvc ( $option );
		
		//アクティブメニューを設定
        $this->view->active_menu = "orders";
	}
	
	/**
	 * 予約フローの最初のステップです。
	 * 予約日と席数を選択する
	 */
	function indexAction() {
		Zend_Loader::loadClass("SelectListModel");	
		
		$request = $this->getRequest();
		$view = $this->view;
		
		$view->number_seat = $request->getParam("number_seat");
		$view->date = $request->getParam("date");
		$view->seat_number_list = SelectListModel::getListSeatNumberList();
		
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
	}
	
	/**
	 * 予約フローの２番目のステップです
	 * 会議室と予約時間を選択する
	 */
	function step2Action() {
		//TODO 必要なクラスを読み込む
		Zend_Loader::loadClass("SelectListModel");
		Zend_Loader::loadClass("RoomModel");
		Zend_Loader::loadClass("OrderModel");	
		
		$request = $this->getRequest();
		$view = $this->view;
		
		if($request->getParam("number_seat") && $request->getParam("date")){
			//TODO　パラメターを読み込む
			$seat_number = $request->getParam("number_seat");
			$date = $request->getParam("date");
			
			//TODO ロームモデルとオーだモデルのインスタンス作成する
			$room_model = new RoomModel();
			$order_model = new OrderModel();
			
			//TODO 会議室と会議室に行うオーだをデータベースから読み出す
			$room_list = $room_model->getListRoom("all", "", $seat_number);
			foreach ($room_list as &$room){
				$room['order_list'] = $order_model->getListOrderOnRoom($room['id'], $date);
			}
			
			//TODO 予約可能性なルームをビィーに送る
			$view->room_list = $room_list;
			$view->room_list_select = SelectListModel::getListRoom($seat_number);
			
			//TODO 必要データをビューに送る
			$view->number_seat = $seat_number;
			$view->date = $date;
			$view->start_time = $request->getParam("start_time");
			$view->end_time = $request->getParam("end_time");
		} 
		
		$view->seat_number_list = SelectListModel::getListSeatNumberList();
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
	}
	
/**
	 * 予約フローの２番目のステップです
	 * 会議室と予約時間を選択する
	 */
	function step2CrossdayAction() {
		//TODO 必要なクラスを読み込む
		Zend_Loader::loadClass("SelectListModel");
		Zend_Loader::loadClass("RoomModel");
		Zend_Loader::loadClass("OrderModel");	
		
		$request = $this->getRequest();
		$view = $this->view;
		
		if($request->getParam("number_seat") && $request->getParam("start_date")){
			//TODO　パラメターを読み込む
			$seat_number = $request->getParam("number_seat");
			$date = $request->getParam("start_date");
			
			//TODO ロームモデルとオーだモデルのインスタンス作成する
			$room_model = new RoomModel();
			$order_model = new OrderModel();
			
			//TODO 会議室と会議室に行うオーだをデータベースから読み出す
			$room_list = $room_model->getListRoom("all", "", $seat_number);
			foreach ($room_list as &$room){
				$room['order_list'] = $order_model->getListOrderOnRoom($room['id'], $date);
			}
			
			//TODO 予約可能性なルームをビィーに送る
			$view->room_list = $room_list;
			$view->room_list_select = SelectListModel::getListRoom($seat_number);
			
			//TODO 必要データをビューに送る
			$view->number_seat = $seat_number;
			$view->date = $date;
			$view->start_date = $date;
			$view->start_time = $request->getParam("start_time");
			$view->end_time = $request->getParam("end_time");
		} 
		
		$view->seat_number_list = SelectListModel::getListSeatNumberList();
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
	}
	
	
	
	/**
	 * 予約フローの３目のステップです
	 * ユーザが確認のステップです
	 */
	function step3Action(){
		//TODO 必要なクラスを読み込む
		Zend_Loader::loadClass("SelectListModel");
		Zend_Loader::loadClass("RoomModel");
		Zend_Loader::loadClass("OrderModel");	
		Zend_Loader::loadClass("AuthModel");
		
		$request = $this->getRequest();
		$view = $this->view;
		$auth = new AuthModel();
		
		if($request->getParam("room_id")){
			//ルームの情報を取る　get room information
			$room_id = $request->getParam("room_id");
			$room_model = new RoomModel();
			$room = $room_model->fetchRoom($room_id);
			
			//他のパラメタ　other paramaters
			$date = $request->getParam("date");
			$start_time = $request->getParam("start_time");
			$end_time = $request->getParam("end_time");
			
			//手数料を計算calculate rent fee
			$fill = OrderModel::calculateFee($room->rent_price, $start_time, $end_time);
			
			//必要データをビューに送る
			$view->room = $room;
			$view->date = $date;
			$view->start_time = $start_time;
			$view->end_time = $end_time;
			$view->fill = $fill + ORDER_FEE;
		}
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
    	
		if($auth->getUserInfo('type') == ADMIN_USER){
			$view->list_user = SelectListModel::getListUser();
		}
	}
	
	/**
	 * オーだフローの最後のステップです
	 * データベースに新しい予約を追加するためのアクションです
	 */
	function orderAction(){
		Zend_Loader::loadClass("SelectListModel");
		Zend_Loader::loadClass("RoomModel");
		Zend_Loader::loadClass("OrderModel");
		Zend_Loader::loadClass("AuthModel");	
		Zend_Loader::loadClass("PaymentHistoryModel");
		
		$request = $this->getRequest();
		$view = $this->view;
		$auth = new AuthModel();
		
		if($request->isPost()){
			//TODO パラメタを取るget parameters
			$room_id = $request->getParam("room_id");
			$rent_price = $request->getParam("rent_price");
			
			$date = $request->getParam("date");
			$start_time = $request->getParam("start_time");
			$start_time = $date . " $start_time:00";
			$end_time = $request->getParam("end_time");
			$end_time = $date . " $end_time:00";
			
			//ユーザIDを取得
			if($auth->getUserInfo('type') == NORMAL_USER){
				$user_id = $auth->getUserInfo("id");
			}else{
				$user_id = $request->getParam("user_id");
			}
			
			//データベースにオーだを追加する
			$order_model = new OrderModel();
			$check = $order_model->addOrder($user_id, $room_id, date('Y-m-d H:i:s', time()), $start_time, $end_time, $rent_price, STATUS_NORMAL);
			
			//fill payment history
			$payment_history_model = new PaymentHistoryModel();
			$payment_history_model->addMoneyForMonths($user_id, $start_time, $end_time, $rent_price);
			$payment_history_model->addOrderCount(substr($start_time, 0, 7), $user_id, 1);
			$payment_history_model->addFee(substr($start_time, 0, 7), $user_id, ORDER_FEE);
			
			$view->result = $check;
		}
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
	}
	
	/**
	 * ユーザのオーだを一覧したり、検索したりするためアクションです
	 */
	function listOrderAction(){
		//TODO 必要なクラスを読み込む
    	Zend_Loader::loadClass("UserModel");
    	Zend_Loader::loadClass("TableModel");
    	Zend_Loader::loadClass("OrderModel");
    	Zend_Loader::loadClass("AuthModel");
    	Zend_Loader::loadClass("SelectListModel");
    	
    	$request = $this->getRequest();
    	$view = $this->view;
    	
    	//TODO パラメタを取得
    	$start_time = $request->getParam('start_time');
    	$end_time = $request->getParam('end_time');
    	$status = $request->getParam('status');
    	$page = $request->getParam('page',1);
    	$room =  $request->getParam('room');
    	
    	//ユーザIDを取得
    	$auth_model = new AuthModel();
    	$user_id = $auth_model->getUserInfo("id");
    	$user_id = $user_id ? $user_id : 1;
    	
    	//TODO ユーザの予約の一覧を読み出すためにオーだモデルのインスタンスを作成する
    	$model = new OrderModel();
    	$data = $model->getListUserOrder($user_id, $start_time, $end_time, $status, $page, 10,$room);
    	$data = $this->updateStatus($data);
    	$data_count = $model->getListUserOrderCount($user_id, $start_time, $end_time, $status,$room);
    	
    	//TODO データを一覧に表現するためにテーブルモデルを作成
    	$table_model = new TableModel();
    	$table_model->setTable_title("自分の予約");
    	
    	//テーブルヘッダを定義する
    	$table_model->addHeader('id', '予約ID', true);
    	$table_model->addHeader('code', '会議室', true);
    	$table_model->addHeader('rent_price', '使用料/30分', false);
    	$table_model->addHeader('ordered_time', '登録時間', false);
    	$table_model->addHeader('start_time', '始め時間', false);
    	$table_model->addHeader('end_time', '終わり時間', true);
    	$table_model->addHeader('rent_total', '料金', false);
    	$table_model->addHeader('status', '予約状態', true);

    	//TODO テーブルのデータを設定
    	$table_model->setTable_data($data);
    	$table_model->setData_count($data_count);
    	$table_model->setPage($page);
    	$table_model->setLine_per_page(10);
    	
    	//TODO テーブルのリンクを設定
    	$table_model->setSearch_link("/user/order");
    	$table_model->setAdd_link(NULL);
    	$table_model->setEdit_link(NULl);
    	$table_model->setDelete_link(NULL);
    	
    	//他のリック
    	$more_links = array('/user/order/cancel'=> 'キャンセル');
    	$table_model->setMore_links($more_links);
    	
    	//マルチアクション設定
    	$table_multi_actions = array('cancel' => 'キャンセル');
    	$table_model->setTable_multi_actions($table_multi_actions);
    	
    	$view->table = $table_model;
    	
    	//TODO AJAXで検索場合
    	if($request->getParam('search')){
    		//disable layout
    		$layout = $this->_helper->layout();
		    $layout->disableLayout();
		    
		    $view->search_mode = 1;
    	}
    	
    	//通知
    	$view->msg = $request->getParam('msg');
    	$view->order_status_list = SelectListModel::getListOrderStatus();

    	$view->room_code_list = SelectListModel::getListRoom();
    	$view->room_code_list = SelectListModel::getListRoom(null,true);
    	$view->popup_msg = $request->getParam("popup_msg");

    	
    	//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['予約参照'] = "/user/list-order";
    	$view->nav = $nav;
	}
	
	/**
	 * 状態をコードからテキストに翻訳する
	 * @param $data
	 */
	private function updateStatus($data){
		$arr[STATUS_NORMAL] = "登録した";
		$arr[STATUS_CANCELED] = "キャンセルされた";
		$arr[STATUS_PENALTY] = "ペナルティ";
		
		foreach ($data as &$row){
			$row['status'] = $arr[$row['status']];
		}
		
		return $data;
	}
	
	/**
	 * 
	 */
	function cancelAction(){
		Zend_Loader::loadClass("OrderModel");
		Zend_Loader::loadClass("AuthModel");
		
		$request = $this->getRequest();
		$view = $this->view;
		$auth = new AuthModel();
		
		//TODO　パラメターを取得
		$order_id = $request->getParam("order_id");
		$view->order_id = $order_id;
		$order_model = new OrderModel();
		
		if(!$request->isPost()){
			//TODO この予約をキャンセル可能かをチェック
			$order_detail = $order_model->getOrderDetail($order_id);
			$view->order_detail = $order_detail;
			$start_time = $order_detail['start_time'];
			
			if($auth->getUserInfo('type') == NORMAL_USER){
				//TODO 予約をキャンセル可能をチェック
				$now = date("Y-m-d H:i:s", time());
				$check_date = strtotime ( '+2 hours' , strtotime($now)) ;
				$check_date = date('Y-m-d H:i:s', $check_date);
				
				if($check_date > $start_time){
					$this->_redirect("/user/order/list-order?popup_msg=" . "２時間前だけの予約がキャンセル可能です");
				}
			}
		}else{
			//TODO 予約をキャンセル
			$cancel_result = $order_model->cancel($order_id, $auth->getUserInfo('type'));
			if($cancel_result == "cannot_cancel")
				$this->_redirect("/user/order/list-order?popup_msg=" . "２時間前だけの予約がキャンセル可能です");
			else{
				if($auth->getUserInfo('type') == NORMAL_USER)
					$this->_redirect("/user/order/list-order?msg=" . "予約をキャンセルされました。");
				else 
					$this->_redirect("/admin/order/index?msg=" . "予約をキャンセルされました。");
			}
		}

		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['予約参照'] = "/user/list-order";
    	$nav['予約キャンセル'] = "#";
    	$view->nav = $nav;
		
	}
	
	function checkRoomBusyAction(){
		Zend_Loader::loadClass("OrderModel");
		$request = $this->getRequest();
		$view = $this->view;

		$room_id = $request->getParam("room_id");
		$order_start_time = $request->getParam("order_start_time");
		$order_end_time = $request->getParam("order_end_time");
		
		$model = new OrderModel();
		$check = $model->checkRoomBusy($room_id, $order_start_time, $order_end_time);
		if($check)
			echo "busy";
		else
			echo "ok";
		exit();
	}
	
	/**
	 * 予約フローの３目のステップです
	 * ユーザが確認のステップです
	 */
	function step3CrossdayAction(){
		//TODO 必要なクラスを読み込む
		Zend_Loader::loadClass("SelectListModel");
		Zend_Loader::loadClass("RoomModel");
		Zend_Loader::loadClass("OrderModel");	
		Zend_Loader::loadClass("AuthModel");
		
		$request = $this->getRequest();
		$view = $this->view;
		$auth = new AuthModel();
		
		if($request->getParam("room_id")){
			//ルームの情報を取る　get room information
			$room_id = $request->getParam("room_id");
			$room_model = new RoomModel();
			$room = $room_model->fetchRoom($room_id);
			
			//他のパラメタ　other paramaters
			$date = $request->getParam("date");
			$start_date = $request->getParam("start_date");
			$start_time = $request->getParam("start_time");
			$end_date = $request->getParam("end_date");
			$end_time = $request->getParam("end_time");
			
			//手数料を計算calculate rent fee
			$fill = OrderModel::calculateFeeCrossday($room->rent_price, $start_date, $start_time, $end_date, $end_time);
			
			//必要データをビューに送る
			$view->room = $room;
			$view->date = $date;
			$view->start_date = $start_date;
			$view->start_time = $start_time;
			$view->end_date = $end_date;
			$view->end_time = $end_time;
			$view->fill = $fill + ORDER_FEE;
		}
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
    	
		if($auth->getUserInfo('type') == ADMIN_USER){
			$view->list_user = SelectListModel::getListUser();
		}
	}
	
	/**
	 * オーだフローの最後のステップです
	 * データベースに新しい予約を追加するためのアクションです
	 */
	function orderCrossdayAction(){
		Zend_Loader::loadClass("RoomModel");
		Zend_Loader::loadClass("OrderModel");
		Zend_Loader::loadClass("AuthModel");
		Zend_Loader::loadClass("PaymentHistoryModel");	
		
		$request = $this->getRequest();
		$view = $this->view;
		$auth = new AuthModel();
		
		if($request->isPost()){
			//TODO パラメタを取るget parameters
			$room_id = $request->getParam("room_id");
			$rent_price = $request->getParam("rent_price");
			
			$start_time = $request->getParam("start_time");
			$end_time = $request->getParam("end_time");
			
			//ユーザIDを取得
			if($auth->getUserInfo('type') == NORMAL_USER){
				$user_id = $auth->getUserInfo("id");
			}else{
				$user_id = $request->getParam("user_id");
			}
			
			//データベースにオーだを追加する
			$order_model = new OrderModel();
			$check = $order_model->addOrder($user_id, $room_id, date('Y-m-d H:i:s', time()), $start_time, $end_time, $rent_price, STATUS_NORMAL);
			
			//fill payment history
			$payment_history_model = new PaymentHistoryModel();
			$payment_history_model->addMoneyForMonths($user_id, $start_time, $end_time, $rent_price);
			$payment_history_model->addOrderCount(substr($start_time, 0, 7), $user_id, 1);
			$payment_history_model->addFee(substr($start_time, 0, 7), $user_id, ORDER_FEE);
			
			$view->result = $check;
		}
		
		//TODO Navigator を設定
    	$nav['ホーム'] = "/user";
    	$nav['会議室予約'] = "/user/order";
    	$view->nav = $nav;
	}
}